/*头文件声明区*/

#include <REGX52.H>
#include "Seg.h"
#include "Key.h"

/*变量声明区*/
//模板变量
unsigned char Key_Slow_Down;
unsigned int Seg_Slow_Down;
unsigned char Key_Val,Key_Down,Key_Up,Key_OLd;
unsigned char Seg_Pos;
unsigned char Seg_Buf[6]={10,10,10,10,10,10};
//功能变量
unsigned char mode;//模式调节变量
unsigned char C_1[3]={23,59,55};//时间数组
unsigned char C_2[3];//时间修改数组
unsigned char C_3[3];//闹钟修改数组
unsigned char C_4[3];//闹钟数组
unsigned char i;//循环变量
unsigned int Timer_1000;//计时1000ms
unsigned int Timer_500;//计时500ms
unsigned char point;//时间修改与闹钟修改闪烁指针
bit flag;//500ms闪烁变量
bit flag1;//闹钟响应变量
unsigned char ucLed;

/*按键处理模块*/
void Key_Proc()
{
	if(Key_Slow_Down)return;
	Key_Slow_Down=0;
	Key_Val=Key_Read();
	Key_Down=Key_Val&(Key_Val^Key_OLd);
	Key_Up=~Key_Val&(Key_Val^Key_OLd);
	Key_OLd=Key_Val;
	if(Key_Down)
	{
		flag1=0;
	}
	switch(Key_Down)
	{
		case 1:
			C_2[0]=C_1[0];
			C_2[1]=C_1[1];
			C_2[2]=C_1[2];
			mode=1;
		break;
		case 2:
			mode=2;
		break;
		case 3:
			if(mode==1||mode==2)
			{
				point++;
				if(point == 3)point=0;
			}
		break;
		case 4:
			
		break;
		case 5:
			if(mode==1)
			{
				C_2[point]++;
				if(C_2[point]== (point==0?24:60))
				{
					C_2[point] = 0;
				}
			}
			if(mode==2)
			{
				C_3[point]++;
				if(C_3[point]== (point==0?24:60))
				{
					C_3[point] = 0;
				}
			}
		break;
		case 6:
			if(mode==1)
			{
				C_2[point]--;
				if(C_2[point]==255)
				{
					C_2[point] = (point==0?23:59);
				}
			}
			if(mode==2)
			{
				C_3[point]--;
				if(C_3[point]==255)
				{
					C_3[point] = (point==0?23:59);
				}
			}
		break;
		case 7:
			if(mode==1)
			{
				C_1[0]=C_2[0];
				C_1[1]=C_2[1];
				C_1[2]=C_2[2];
				mode=0;
				point=0;
			}
			if(mode==2)
			{
				C_4[0]=C_3[0];
				C_4[1]=C_3[1];
				C_4[2]=C_3[2];
			}
			mode=0;
			point=0;
		break;
		case 8:
		{
			if(mode==1)
			{
				C_2[0]=C_1[0];
				C_2[1]=C_1[1];
				C_2[2]=C_1[2];
			}
			if(mode==2)
			{
				C_3[0]=C_4[0];
				C_3[1]=C_4[1];
				C_3[2]=C_4[2];
			}
			mode = 0;
			point=0;
		}
	}
	
}



/*信息处理函数*/
void Seg_Proc()
{
	switch(mode)
	{
		case 0:
			for(i=0;i<3;i++)
			{
				Seg_Buf[2*i]=C_1[i]/10%10;
				Seg_Buf[1+2*i]=C_1[i]%10;
			}
		break;
		case 1://时钟设置
			
		
			for(i=0;i<3;i++)
			{
				if(i==point)
				{
					if(flag)
					{
						Seg_Buf[2*i]=C_2[i]/10%10;
						Seg_Buf[1+2*i]=C_2[i]%10;
					}
					else
					{
						Seg_Buf[2*i]=10;
						Seg_Buf[1+2*i]=10;
					}
				}
				else
				{
					Seg_Buf[2*i]=C_2[i]/10%10;
					Seg_Buf[1+2*i]=C_2[i]%10;
				}
			}
		break;
		case 2://闹钟设置
			for(i=0;i<3;i++)
			{
				if(i==point)
				{
					if(flag)
					{
						Seg_Buf[2*i]=C_3[i]/10%10;
						Seg_Buf[1+2*i]=C_3[i]%10;
					}
					else
					{
						Seg_Buf[2*i]=10;
						Seg_Buf[1+2*i]=10;
					}
				}
				else
				{
					Seg_Buf[2*i]=C_3[i]/10%10;
					Seg_Buf[1+2*i]=C_3[i]%10;
				}
			}
		break;
		
	}
}

/*其它显示函数*/
void LED()
{
	if(C_1[0]==C_4[0]&&C_1[1]==C_4[1]&&C_1[2]==C_4[2])
	{
		flag1 = 1;
	}
	
	if(flag1)
	{
		P1 = ucLed;
		P2_3 = 0;
	}
	else
	{
		ucLed=0xff;
		P1 = 0xff;
		P2_3 = 1;
	}
}

/*定时器0初始化函数*/
void Timer0Init(void)		//1毫秒@12.000MHz
{
	
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
	EA = 1;
	
}



/*定时器0中断服务函数*/
void Timer_Server()interrupt 1
{
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	if(++Key_Slow_Down==10)Key_Slow_Down=0;
	if(++Seg_Slow_Down==500)Seg_Slow_Down=0;
	if(++Seg_Pos==6)Seg_Pos=0;
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);
	if(++Timer_1000==1000)
	{
		Timer_1000=0;
		C_1[2]++;
		if(C_1[2]==60)
		{
			C_1[2]=0;
			C_1[1]++;
			if(C_1[1]==60)
			{
				C_1[1]=0;
				C_1[0]++;
				if(C_1[0]==24)C_1[0]=0;
			}
		}
	}
	if(++Timer_500==500)
	{
		Timer_500=0;
		flag^=1;
		if(flag1==1)
		{
			if(C_1[0]<12)
			{
				ucLed^=0x0f;
			}
			if(C_1[0]>=12)
			{
				ucLed^=0xf0;
			}
		}
	}
}
/*Main*/
void main()
{
	 Timer0Init();
	while(1)
	{
		Key_Proc();
		Seg_Proc();
		LED();
		
	}
}






